/*
 * Copyright (c) 2024 endless-sky
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _HAL_AUDIO_H_
#define _HAL_AUDIO_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "hal_struct.h"

/**
 * @function:   Hal_AENC_Start
 * @brief:      开启音频编码
 * @param[in]:  HAL_U32 aiChan 音频采集通道
 * @param[in]:  HAL_AENC_COM_CONFIG_S *pCfg  编码参数
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 * @other:      需保证aiChan已开启
 */
int32_t Hal_Aenc_Start(uint32_t aiChan, HAL_AENC_COM_CONFIG_S *pCfg);

/**
 * @function:   Hal_AENC_Stop
 * @brief:      停止音频编码
 * @param[in]:  HAL_U32 aiChan   音频采集通道
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Aenc_Stop(uint32_t aiChan);

/**
 * @function:   Hal_AENC_GetStream
 * @brief:      获取音频编码码流，调用一次获取一帧
 * @param[in]:  HAL_U32 aiChan 音频采集通道
 * @param[out]: HAL_AENC_STREAM *pStream  码流帧信息
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Aenc_GetStream(uint32_t aiChan, HAL_AENC_STREAM_S *pStream);

/**
 * @function:   Hal_AENC_ReleaseStream
 * @brief:      释放音频帧
 * @param[in]:  HAL_U32 aiChan 音频采集通道
 * @param[out]: HAL_AENC_STREAM *pStream  码流帧信息
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Aenc_ReleaseStream(uint32_t aiChan, uint8_t *pReleaseHandler);

/**
 * @function:   Hal_ADEC_Start
 * @brief:      开启音频解码
 * @param[in]:  HAL_U32 aoChan 音频输出通道
 * @param[in]:  HAL_ADEC_COM_CONFIG_S *pCfg  解码参数
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 * @other:      需保证aoChan已开启
 */
int32_t Hal_Adec_Start(uint32_t aoChan, HAL_ADEC_COM_CONFIG_S *pCfg);

/**
 * @function:   Hal_ADEC_Stop
 * @brief:      停止音频解码
 * @param[in]:  HAL_U32 aoChan   音频输出通道
 * @param[in]:  HAL_U32 timeOut  超时时间
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 * @other:      解码过程需要时间，超时后未解码数据会强制停止解码
 */
int32_t Hal_Adec_Stop(uint32_t aoChan, uint32_t timeOut);

/**
 * @function:   Hal_ADEC_SendData
 * @brief:      发送音频数据进行解码
 * @param[in]:  HAL_U32 aoChan    音频输出通道
 * @param[in]:  HAL_U8* pData     音频数据地址
 * @param[in]:  HAL_U32 dataLen   音频数据长度，建议每次传640字节，尾部除外
 * @param[in]:  bool block        是否阻塞直到底层接口完成（平台定义，通常是数据被解码模块接受）。
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Adec_SendData(uint32_t aoChan, uint8_t *pData, uint32_t dataLen, bool block);

/**
 * @function:   Hal_AO_CheckDone
 * @brief:      查询AO的数据是否播完
 * @param[in]:  HAL_U32 AoDevId   Ao设备ID
 * @param[in]:  HAL_U32 AoChn    AO通道号
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 * @other:      0：播完了；1：没有播完<0: 出错；  其它			失败，请参考错误码。
 */
int32_t Hal_Ao_CheckDone(uint32_t AoDevId, uint32_t AoChn);

/**
 * @function:   Hal_Ao_SetVol
 * @brief:      设置输出音量
 * @param[in]:  HAL_U32 vol     音量值[0-100],0为静音
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 * @other:      失败，请参考错误码。
 */
int32_t Hal_Ao_SetVol(int32_t vol);

/**
 * @function:   Hal_AI_SetVol
 * @brief:      设置输入音量
 * @param[in]:  HAL_U32 vol     音量值[0-100],0为静音
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 * @other:      失败，请参考错误码。
 */
int32_t Hal_AI_SetVol(uint32_t vol);

#ifdef __cplusplus
}
#endif

#endif // _HAL_AUDIO_H_
